import axios from "axios";
import config from "./config";
import router from "@/router";

// 创建实例化axios的请求方法

// 1. 请求拦截器
// 1.1 在header上加token
// 1.2 如果没有登录态，主动跳转到登录页
// 1.3 有报错，主动抛出
// 2. 响应拦截器
// 2.1 对后端返回的数据进行筛选
// 2.2 有报错，主动抛出
// 3. 处理正确返回的逻辑
// 3.1 判断是否业务上逻辑正确
// 3.2 有报错，主动抛出

export default function request(options) {
    return new Promise((resolve, reject)=>{
        const instance = axios.create({
            ...config
        })
// 请求拦截器
        instance.interceptors.request.use(
            (config)=>{
                let token = localStorage.getItem("pm_token")
                if (token) {
                    config.headers.token = token
                } else {
                    router.push("/login")
                }
                return config
            },
            (error)=>{
                if (error.message.indexOf('timeout') !== -1) {
                    ElMessage({
                        message:"请求超时",
                        type:'error',
                        showClose:true
                    })
                }
                return Promise.reject(error)
            }
        )

        // 响应拦截器
        instance.interceptors.response.use(
            (response)=>{
                console.log('response',response);
                return response.data
            },
            (err)=>{
                if (err && err.response) {
                    switch (err.response.status) {
                        case 400:
                            err.message = '请求错误'
                            break;
                        // 401 403 404.....
                        default:
                            break;
                    }
                }
                if (err.message) {
                    ElMessage({
                        message: err.message,
                        type:'error',
                        showClose:true
                    })
                }
                return Promise.reject(err)
            }
        )

        instance(options)
        .then((res)=>{
            if (res.code === 200) {
                resolve(res)
            } else {
                // 1. 未登录
                if (res.code === -2) {
                    router.push('/login')
                }
                ElMessage({
                    message: res.msg || '操作失败',
                    type:'error',
                    showClose:true
                })
                reject(res)
            }
        })
        .catch((error)=>{
            reject(error)
        })
    })
}